#ifndef __BSP_FLASH_H__
#define __BSP_FLASH_H__

#include <stdint.h>

#define FLASH_BASE_ADDR     0x08000000
#define FLASH_SIZE          0x01000000
#define FLASH_END_ADDR      FLASH_BASE_ADDR + FLASH_SIZE
                            
#define FLASH_SECTOR_SIZE   2048  

/**
 * @brief  Flash 读取字节数据
 * @param  u32Addr: 读取地址
 * @param  pu8Buffer: 读取数据缓存区
 * @param  u32Len: 读取数据长度
 * @retval 0: 成功 其他: 失败
 */
uint8_t 
bsp_flash_read_byte(uint32_t u32Addr, uint8_t *pu8Buffer, uint32_t u32Len);

/**
 * @brief  Flash 读取半字数据
 * @param  u32Addr: 读取地址
 * @param  pu16Buffer: 读取数据缓存区
 * @param  u32Len: 读取数据长度
 * @retval 0: 成功 其他: 失败
 */
uint8_t 
bsp_flash_read_halfword(uint32_t u32Addr, uint16_t *pu16Buffer, uint32_t u32Len);

/**
 * @brief  Flash 读取字数据
 * @param  u32Addr: 读取地址
 * @param  pu32Buffer: 读取数据缓存区
 * @param  u32Len: 读取数据长度
 * @retval 0: 成功 其他: 失败
 */
uint8_t 
bsp_flash_read_word(uint32_t u32Addr, uint32_t *pu32Buffer, uint32_t u32Len);

/**
 * @brief  Flash 扇区擦除
 * @param  u32Addr: 地址
 * @retval 0: 成功 其他: 失败
 */
uint8_t 
bsp_flash_erase_sector(uint32_t u32Addr);

/**
 * @brief  Flash 写字节数据
 * @param  u32Addr: 写入地址
 * @param  pu8Buffer: 写入数据缓存区
 * @param  u32Len: 写入数据长度
 * @retval 0: 成功 其他: 失败
 */
uint8_t 
bsp_flash_write_byte(uint32_t u32Addr, uint8_t *pu8Buffer, uint32_t u32Len);

/**
 * @brief  Flash 写半字数据
 * @param  u32Addr: 写入地址
 * @param  pu16Buffer: 写入数据缓存区
 * @param  u32Len: 写入数据长度
 * @retval 0: 成功 其他: 失败
 */
uint8_t 
bsp_flash_write_halfword(uint32_t u32Addr, uint16_t *pu16Buffer, uint32_t u32Len);

/**
 * @brief  Flash 写字数据
 * @param  u32Addr: 写入地址
 * @param  pu32Buffer: 写入数据缓存区
 * @param  u32Len: 写入数据长度
 * @retval 0: 成功 其他: 失败
 */
uint8_t 
bsp_flash_write_word(uint32_t u32Addr, uint32_t *pu32Buffer, uint32_t u32Len);

uint8_t bsp_flash_write(uint32_t u32Addr, uint8_t *pu8Buffer, uint32_t u32Len);

uint8_t bsp_flash_read(uint32_t u32Addr, uint8_t *pu8Buffer, uint32_t u32Len);

#endif /* __BSP_FLASH_H__ */
